#include "cserialobject.h"
#include <QDebug>

CSerialObject::CSerialObject(QObject *parent)
    : QObject{parent}
{
    qcRecvArray.clear();
}

void CSerialObject::slot_init()
{
    qDebug() << "slot_init() id=:" << QThread::currentThreadId();
    qDebug() << "slot_init():" << QThread::currentThread();

    qcSerialPortObj = new QSerialPort(); //在运行在子线程的槽函数中创建 QSerialPort 对象，以为QSerialPort类不是线程安全的

    if(!qcSerialPortObj->isOpen())//如果没有打开处理
    {
        qcSerialPortObj->setParity(QSerialPort::NoParity);//设置奇偶校验位为0
        qcSerialPortObj->setDataBits(QSerialPort::Data8);//设置数据位为8bit
        qcSerialPortObj->setFlowControl(QSerialPort::NoFlowControl);//设置流控制为OFF
        qcSerialPortObj->setStopBits(QSerialPort::OneStop);//设置停止位为1
        qcSerialPortObj->setBaudRate(9600);
        qcSerialPortObj->setPortName("COM14");

        if(!qcSerialPortObj->open(QIODevice::ReadWrite))//用ReadWrite 的模式尝试打开串口
        {
            qDebug()<<qcSerialPortObj->portName()<<"串口打开失败";
            return;
        }
        else
        {
            qcTimerObj  = new QTimer(this);
            connect(qcTimerObj, &QTimer::timeout,this,&CSerialObject::slot_recv_data);
            qcTimerObj->start(100);
            //connect(qcSerialPortObj,&QSerialPort::readyRead,this,&CSerialObject::slot_recv_data);
            qDebug()<<qcSerialPortObj->portName()<<"串口打开成功,波特率:"<<qcSerialPortObj->baudRate();
        }

    }

}

void CSerialObject::slot_recv_data()
{
    iCurRecvLen = qcSerialPortObj->bytesAvailable(); //读取当前的串口接收缓存中数据的长度
    if(iLastRecvLen != iCurRecvLen){ //如果两次定时器超时之间的数据没有变化, 说明数据已经结束完成
        iLastRecvLen = iCurRecvLen; //iLastRecvLen
    }
    else if(iLastRecvLen != 0){
        iRecvLenTitle += iLastRecvLen;
        qDebug() << "active data len=" << iLastRecvLen << "title = " << iRecvLenTitle;
        qcRecvArray = qcSerialPortObj->readAll(); //qcRecvArray每次的值会自动覆盖
        qDebug() << "data="<<qcRecvArray.toHex();
        iCurRecvLen = 0;
        iLastRecvLen = 0;
        iLastRecvLen = 0;
        emit sign_send_frame(qcRecvArray);
    }
}

void CSerialObject::slot_send_data()
{

}


void CSerialObject::slot_colse()
{
    if(qcSerialPortObj->isOpen()){
        qcSerialPortObj->clear();
        qcSerialPortObj->close();
    }
}

void CSerialObject::slot_recv_frame(QByteArray data)
{
    qDebug()<<"slot_recv_frame="<<data;
    qcSerialPortObj->write(data);
}
